package com.iot.modbus.reader;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
 * 数据转换
 */
public class Reader {

    /**
     * 将两个寄存器的数据转换为整数（int）
     *
     * @param registers 寄存器数据数组
     * @param offset    开始索引
     * @param byteOrder 字节顺序（BIG_ENDIAN 或 LITTLE_ENDIAN）
     * @return 整数值
     */
    public static int convertRegistersToUInt16(short[] registers, int offset, ByteOrder byteOrder) {
        ByteBuffer buffer = ByteBuffer.allocate(2); // 分配 4 字节缓冲区
        buffer.order(byteOrder); // 设置字节顺序

        // 将两个寄存器数据写入缓冲区
        buffer.putShort(registers[offset]);
        buffer.putShort(registers[offset + 1]);

        buffer.flip(); // 切换到读模式
        return buffer.getInt(); // 从缓冲区读取整数
    }


    /**
     * 将两个寄存器的数据转换为整数（int）
     *
     * @param registers 寄存器数据数组
     * @param offset    开始索引
     * @param byteOrder 字节顺序（BIG_ENDIAN 或 LITTLE_ENDIAN）
     * @return 整数值
     */
    public static int convertRegistersToInt32(short[] registers, int offset, ByteOrder byteOrder) {
        ByteBuffer buffer = ByteBuffer.allocate(4); // 分配 4 字节缓冲区
        buffer.order(byteOrder); // 设置字节顺序

        // 将两个寄存器数据写入缓冲区
        buffer.putShort(registers[offset]);
        buffer.putShort(registers[offset + 1]);

        buffer.flip(); // 切换到读模式
        return buffer.getInt(); // 从缓冲区读取整数
    }

    /**
     * 将两个寄存器的数据转换为整数（int）
     *
     * @param registers 寄存器数据数组
     * @param offset    开始索引
     * @param byteOrder 字节顺序（BIG_ENDIAN 或 LITTLE_ENDIAN）
     * @return 整数值
     */
    public static long convertRegistersToUInt32(short[] registers, int offset, ByteOrder byteOrder) {
        ByteBuffer buffer = ByteBuffer.allocate(4); // 分配 4 字节缓冲区
        buffer.order(byteOrder); // 设置字节顺序

        // 将两个寄存器数据写入缓冲区
        buffer.putShort(registers[offset]);
        buffer.putShort(registers[offset + 1]);

        buffer.flip(); // 切换到读模式
        return buffer.getLong(); // 从缓冲区读取整数
    }



    /**
     * 将四个寄存器的数据转换为长整型（long）
     *
     * @param registers 寄存器数据数组
     * @param byteOrder 字节顺序（BIG_ENDIAN 或 LITTLE_ENDIAN）
     * @return 长整型值
     */
    public static long convertRegistersToInt64(short[] registers,int offset, ByteOrder byteOrder) {
        ByteBuffer buffer = ByteBuffer.allocate(8); // 分配 8 字节缓冲区
        buffer.order(byteOrder); // 设置字节顺序

        // 将四个寄存器数据写入缓冲区
        buffer.putShort(registers[offset]);
        buffer.putShort(registers[offset+1]);
        buffer.putShort(registers[offset+2]);
        buffer.putShort(registers[offset+3]);

        buffer.flip(); // 切换到读模式
        return buffer.getLong(); // 从缓冲区读取长整型
    }
    /**
     * 将两个寄存器的数据转换为浮点数（float）
     *
     * @param registers 寄存器数据数组
     * @param offset    开始索引
     * @param byteOrder 字节顺序（BIG_ENDIAN 或 LITTLE_ENDIAN）
     * @return 浮点数值
     */
    public static float convertRegistersToFloat32(short[] registers, int offset, ByteOrder byteOrder) {
        ByteBuffer buffer = ByteBuffer.allocate(4); // 分配 4 字节缓冲区
        buffer.order(byteOrder); // 设置字节顺序

        // 将两个寄存器数据写入缓冲区
        buffer.putShort(registers[offset]);
        buffer.putShort(registers[offset + 1]);

        buffer.flip(); // 切换到读模式
        return buffer.getFloat(); // 从缓冲区读取浮点数
    }


    /**
     * 将四个寄存器的数据转换为双精度浮点数（double）
     *
     * @param registers 寄存器数据数组
     * @param offset    开始索引
     * @param byteOrder 字节顺序（BIG_ENDIAN 或 LITTLE_ENDIAN）
     * @return 双精度浮点数值
     */
    public static double convertRegistersToFloat64(short[] registers, int offset, ByteOrder byteOrder) {
        ByteBuffer buffer = ByteBuffer.allocate(8); // 分配 8 字节缓冲区
        buffer.order(byteOrder); // 设置字节顺序

        // 将四个寄存器数据写入缓冲区
        buffer.putShort(registers[offset]);
        buffer.putShort(registers[offset + 1]);
        buffer.putShort(registers[offset + 2]);
        buffer.putShort(registers[offset + 3]);

        buffer.flip(); // 切换到读模式
        return buffer.getDouble(); // 从缓冲区读取双精度浮点数
    }


}
